Skip to content

Conversation

@05F3759DF
Copy link
Contributor

Summary

Add Vue 3 web control panel (axon_panel) for browser-based recorder monitoring and control, implement mock plugin with C ABI interface for independent testing, and add placeholder apps for axon_config and axon_transfer.

Motivation

The recorder needs a user-friendly web interface for monitoring state, controlling recording operations, and viewing activity logs. Additionally, a mock plugin enables comprehensive E2E testing without requiring a full ROS environment, improving CI/CD reliability and development velocity.

Changes

Web Control Panel (apps/axon_panel/)

  • Vue 3 SPA with Vite build system for fast development
  • Real-time state monitoring with visual state machine diagram (Vue Flow)
  • Recording control: config, begin, pause, resume, finish, cancel operations
  • Activity log panel with color-coded messages and timestamps
  • Connection status indicator with auto-reconnect
  • Responsive design supporting desktop and mobile viewports

Mock Plugin (middlewares/mock/src/mock_plugin/)

HTTP RPC API Enhancements (apps/axon_recorder/http_server.cpp)

  • /rpc/status endpoint now returns cached task configuration
  • Exposes task_id, device_id, scene, topics, and other metadata
  • Sensitive fields (callback URLs, tokens) excluded for security

Application Structure Updates

  • Moved axon_panel from tools/ to apps/ for better organization
  • Added placeholder apps: axon_config (CLI tool), axon_transfer (S3 daemon)
  • Removed obsolete plugin example tests

Documentation

Testing

Backward Compatibility

  • Fully backward compatible - no breaking changes to existing APIs or interfaces
  • New /rpc/status response fields are additive
  • Mock plugin is optional; existing ROS plugins unchanged

Related Files

Added:

Modified:

Deleted:

@greptile-apps
Copy link

greptile-apps bot commented Feb 9, 2026

Greptile Overview

Greptile Summary

This PR adds a new Vue 3/Vite web control panel (apps/axon_panel) for monitoring and controlling axon_recorder via HTTP RPC, introduces a standalone mock middleware plugin with C ABI exports (middlewares/mock/src/mock_plugin) plus scripts/tests for CI-friendly E2E workflows, and adds placeholder apps (axon_config, axon_transfer). It also extends the recorder’s /rpc/state response with cached task_config metadata.

Key merge blockers to address:

  • Makefile still contains unresolved git merge conflict markers, which will break make targets.
  • The recorder E2E runner script’s mock plugin path assumptions don’t align with how make build-mock builds the plugin.
  • The panel RPC client currently logs full request/response payloads unconditionally; this should be gated/removed for production.
  • Documentation/config mismatch: Vite dev server port and repo layout references need to be consistent with the move to apps/axon_panel.

Confidence Score: 2/5

  • Not safe to merge until build tooling and test paths are fixed.
  • The Makefile contains unresolved merge conflict markers which will break make parsing (hard blocker). Additionally, the E2E runner’s mock plugin path likely won’t work after make build-mock, and the panel RPC client unconditionally logs request/response payloads. The rest of the changes appear additive and reasonably isolated.
  • Makefile; apps/axon_recorder/test/e2e/run_e2e_tests.sh; apps/axon_panel/src/api/rpc.js; apps/axon_panel/vite.config.js; CLAUDE.md

Important Files Changed

Filename Overview
CLAUDE.md Updated architecture/docs for axon_panel and mock middleware, but repo tree section still references tools/axon_panel (inconsistent with move to apps/axon_panel).
Makefile Adds mock middleware build/test targets but contains unresolved git merge conflict markers that will break make parsing.
apps/axon_recorder/http_server.cpp Extended /rpc/state response to include cached task_config metadata via callbacks_.get_task_config; change is additive and guarded by callback existence.
apps/axon_recorder/test/e2e/run_e2e_tests.sh Updated E2E runner to use new mock middleware plugin, but plugin path resolution assumes a source-tree build directory and will often fail after make build-mock.
apps/axon_panel/src/api/rpc.js Added axios-based RPC client; currently logs full request/response payloads unconditionally (should be gated/removed for production).
apps/axon_panel/vite.config.js Added Vite dev server proxy; hard-codes port 3000 while docs mention 5173 (needs alignment).
middlewares/mock/src/mock_plugin/CMakeLists.txt Introduced standalone CMake project for mock plugin + tests; builds into a local build dir (drives path assumptions in scripts).

Sequence Diagram

sequenceDiagram
    participant Panel as axon_panel (Vue SPA)
    participant RPC as axon_recorder HTTP RPC
    participant Rec as axon_recorder core
    participant Plug as Plugin (ROS/mock)

    Panel->>RPC: POST /rpc/status
    RPC->>Rec: read cached task config + recorder state
    Rec-->>RPC: state + task metadata
    RPC-->>Panel: status JSON

    alt User starts recording
        Panel->>RPC: POST /rpc/config (task config)
        RPC->>Rec: set task config
        Panel->>RPC: POST /rpc/begin
        RPC->>Rec: begin()
        Rec->>Plug: publish/subscribe via plugin ABI
        Plug-->>Rec: messages/events
        Rec-->>RPC: OK
        RPC-->>Panel: OK
    end

    loop Auto-reconnect/poll
        Panel->>RPC: POST /rpc/status
        RPC-->>Panel: status JSON
    end
Loading

Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

7 files reviewed, 6 comments

Edit Code Review Agent Settings | Greptile

Comment on lines 1 to 24
import axios from 'axios'

const BASE_URL = import.meta.env.VITE_API_BASE_URL || ''

// Create axios instance with interceptors for debugging
const apiClient = axios.create({
baseURL: BASE_URL,
headers: {
'Content-Type': 'application/json'
}
})

// Request interceptor
apiClient.interceptors.request.use(
(config) => {
console.log('[API Request]', config.method.toUpperCase(), config.url, config.data)
return config
},
(error) => {
console.error('[API Request Error]', error)
return Promise.reject(error)
}
)

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Debug logging in production

The axios request/response interceptors always console.log full request payloads (config.data) and response bodies. That will leak task metadata into browser logs and will also be noisy in production builds. If you want this for dev, gate it behind a dev flag (e.g., if (import.meta.env.DEV)) or remove it before merging.

Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/axon_panel/src/api/rpc.js
Line: 1:24

Comment:
**Debug logging in production**

The axios request/response interceptors always `console.log` full request payloads (`config.data`) and response bodies. That will leak task metadata into browser logs and will also be noisy in production builds. If you want this for dev, gate it behind a dev flag (e.g., `if (import.meta.env.DEV)`) or remove it before merging.

How can I resolve this? If you propose a fix, please make it concise.

Comment on lines 5 to 12
plugins: [vue()],
server: {
port: 3000,
host: '0.0.0.0',
proxy: {
'/rpc': {
target: 'http://localhost:8080',
changeOrigin: true
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dev server port mismatch

The PR description/docs mention the panel dev server at http://localhost:5173, but vite.config.js hard-codes server.port = 3000. This will confuse users following the docs.

Either update the docs to 3000 or drop the explicit port so Vite uses its default.

Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/axon_panel/vite.config.js
Line: 5:12

Comment:
**Dev server port mismatch**

The PR description/docs mention the panel dev server at `http://localhost:5173`, but `vite.config.js` hard-codes `server.port = 3000`. This will confuse users following the docs.

Either update the docs to 3000 or drop the explicit port so Vite uses its default.

How can I resolve this? If you propose a fix, please make it concise.

Comment on lines +140 to +162
│ (Vue 3 Web UI) │ State Control │ (C++ Backend) │
│ - Monitor state │ - config │ - HTTP RPC Server │
│ - Control buttons │ - begin │ - Plugin Loader │
│ - View stats │ - pause/resume │ - MCAP Writer │
│ - Activity log │ - finish/cancel │ - Worker Threads │
└─────────────────────┘ └──────────┬──────────┘
│ Upload requests
┌─────────────────────┐
│ axon_transfer │
│ (Transfer Daemon) │
│ - S3 multipart │
│ - Retry logic │
│ - State recovery │
└──────────┬──────────┘
┌─────────────────────┐
│ S3 Storage │
└─────────────────────┘
```

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Outdated repo layout docs

CLAUDE.md still documents tools/axon_panel, but this PR moved the panel to apps/axon_panel (per PR summary and file tree). As written, the documented repo structure is now incorrect.

Update the tree snippet under “Axon/” to reflect the current location and remove the stale tools/axon_panel entry.

Prompt To Fix With AI
This is a comment left during a code review.
Path: CLAUDE.md
Line: 140:162

Comment:
**Outdated repo layout docs**

`CLAUDE.md` still documents `tools/axon_panel`, but this PR moved the panel to `apps/axon_panel` (per PR summary and file tree). As written, the documented repo structure is now incorrect.

Update the tree snippet under “Axon/” to reflect the current location and remove the stale `tools/axon_panel` entry.

How can I resolve this? If you propose a fix, please make it concise.

@greptile-apps
Copy link

greptile-apps bot commented Feb 9, 2026

Additional Comments (3)

Makefile
Merge conflict markers

This file still contains unresolved git merge conflict markers (<<<<<<<, =======, >>>>>>>). make will fail to parse this, and it’s a hard blocker for merging. Please resolve the conflict and remove the markers, keeping the intended test-uploader behavior.

Prompt To Fix With AI
This is a comment left during a code review.
Path: Makefile
Line: 220:236

Comment:
**Merge conflict markers**

This file still contains unresolved git merge conflict markers (`<<<<<<<`, `=======`, `>>>>>>>`). `make` will fail to parse this, and it’s a hard blocker for merging. Please resolve the conflict and remove the markers, keeping the intended `test-uploader` behavior.

How can I resolve this? If you propose a fix, please make it concise.

apps/axon_recorder/test/e2e/run_e2e_tests.sh
Incorrect mock plugin path

MOCK_PLUGIN points into middlewares/mock/src/mock_plugin/build/... under the source tree, but the mock plugin is built via CMake into the main build tree (i.e., under ${BUILD_DIR}/...), not by default into a build/ folder inside the source directory. As written, the script will often fail to find the plugin even after make build-mock.

Consider using only ${BUILD_DIR}/middlewares/mock_plugin/libmock_plugin.so (or whatever the actual CMake output path is) and removing the source-tree .../src/mock_plugin/build/... assumptions.

Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/axon_recorder/test/e2e/run_e2e_tests.sh
Line: 35:52

Comment:
**Incorrect mock plugin path**

`MOCK_PLUGIN` points into `middlewares/mock/src/mock_plugin/build/...` under the source tree, but the mock plugin is built via CMake into the main build tree (i.e., under `${BUILD_DIR}/...`), not by default into a `build/` folder inside the source directory. As written, the script will often fail to find the plugin even after `make build-mock`.

Consider using only `${BUILD_DIR}/middlewares/mock_plugin/libmock_plugin.so` (or whatever the actual CMake output path is) and removing the source-tree `.../src/mock_plugin/build/...` assumptions.

How can I resolve this? If you propose a fix, please make it concise.

Makefile
More unresolved conflicts

There are additional merge conflict markers in the clean target (<<<<<<< HEAD / ======= / >>>>>>>) which will break make clean parsing. Please resolve this conflict as well and remove the markers.

Prompt To Fix With AI
This is a comment left during a code review.
Path: Makefile
Line: 480:546

Comment:
**More unresolved conflicts**

There are additional merge conflict markers in the `clean` target (`<<<<<<< HEAD` / `=======` / `>>>>>>>`) which will break `make clean` parsing. Please resolve this conflict as well and remove the markers.

How can I resolve this? If you propose a fix, please make it concise.

@05F3759DF 05F3759DF merged commit e0b28e2 into main Feb 10, 2026
23 checks passed
@05F3759DF 05F3759DF deleted the feat/axon-panel branch February 10, 2026 14:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant